/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.awt.print.PrinterException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarError;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarMensaje;
import pe.com.cotelasa.helper.VentaFacturacionPrintHelper;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKComponenteAddVentaDetalleNC;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaDetalleNotaCredito;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaNotaCredito;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.COLOR_ESTADO_VENTA;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioNumeroALetras;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCorrelativoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioIgv;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoCambio;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaDetalleNotaCredito;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaNotaCredito;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.CorrelativoDocumento;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;
import pe.com.cotelasa.scp.entidad.TipoCambio;
import pe.com.cotelasa.scp.entidad.TipoDocumento;
import pe.com.cotelasa.scp.entidad.TipoFormaPago;
import pe.com.cotelasa.scp.entidad.TipoMoneda;
import pe.com.cotelasa.scp.entidad.VentaDetalleFacturacion;
import pe.com.cotelasa.scp.entidad.VentaDetalleNotaCredito;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.scp.entidad.VentaNotaCredito;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author Jorge
 */
@Named(value = "MBVentaNotaCredito")
@Scope("request")
public class MBVentaNotaCredito extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static Logger logger = Logger.getLogger(MBVentaNotaCredito.class);
    @Inject
    private BKVentaNotaCredito bkVentaNotaCredito;
    @Inject
    private BKVentaDetalleNotaCredito bkVentaDetalleNotaCredito;
    @Inject
    private IServicioVentaNotaCredito servicioVentaNotaCredito;
    @Inject
    private IServicioVentaDetalleNotaCredito servicioVentaDetalleNotaCredito;
    @Inject
    private IServicioTipoMoneda servicioTipoMoneda;
    @Inject
    private IServicioIgv servicioIgv;
    @Inject
    private MBComponenteFindCliente mbComponenteFindCliente;
    @Inject
    private MBComponenteAddFacturaNC mbComponenteAddFacturaNC;
    @Inject
    private IServicioTipoCambio servicioTipoCambio;
    @Inject
    private IServicioVentaFacturacion servicioVentaFacturacion;
    @Inject
    private IServicioParametro servicioParametro;
    @Inject
    private IServicioTipoDocumento servicioTipoDocumento;
    @Inject
    private IServicioCorrelativoDocumento servicioCorrelativo;
    @Autowired
    BKSession session;

    @Override
    public String actualizar() {
        try {
            //bkVentaNotaCredito.getVentaCreditoFormulario().setMoneda(servicioTipoMoneda.conseguirTipoMonedaPorId(bkVentaNotaCredito.getIdTipoMoneda()));
            bkVentaNotaCredito.getVentaCreditoFormulario().setMotEmision(bkVentaNotaCredito.getIdTipoMotivo());
            bkVentaNotaCredito.getVentaCreditoFormulario().setUsrModificacion(session.getUsuario().getUsuario());
            bkVentaNotaCredito.getVentaCreditoFormulario().setFecModificacion(new Date());

            servicioVentaNotaCredito.actualizarVentaNotaCredito(bkVentaNotaCredito.getVentaCreditoFormulario());

            List<VentaDetalleNotaCredito> listaAux = new ArrayList<VentaDetalleNotaCredito>();
            for (VentaDetalleNotaCredito detalle : bkVentaDetalleNotaCredito.getListaDetalleNotaCredito()) {
                listaAux.add(detalle);
            }

            servicioVentaNotaCredito.eliminarDetalleNC(bkVentaNotaCredito.getVentaCreditoFormulario().getCodnc());

            for (VentaDetalleNotaCredito det : listaAux) {

                det.setCodnc(bkVentaNotaCredito.getVentaCreditoFormulario());
                servicioVentaDetalleNotaCredito.guardarVentaDetalleNotaCredito(det);
            }

            bkVentaNotaCredito.setVentaCreditoSeleccionado(bkVentaNotaCredito.getVentaCreditoFormulario());
            buscarListaNotasCredito();
            mostrarMensaje("Se actualizó la Nota de Crédito satisfactoriamente.");
            return editar();
        } catch (Exception e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_CREDITO;
        }
    }

    @Override
    public String guardar() {
        boolean flag = true;
        try {

            flag = servicioVentaNotaCredito.esNumeroDocCorrecta(bkVentaNotaCredito.getVentaCreditoFormulario());

            if (flag) {
                mostrarError("El número de Nota de Crédito ya ha sido registrado.");
                return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_CREDITO;
            }

            
            bkVentaNotaCredito.getVentaCreditoFormulario().setMotEmision(bkVentaNotaCredito.getIdTipoMotivo());
            bkVentaNotaCredito.getVentaCreditoFormulario().setUsrCreacion(session.getUsuario().getUsuario());
            bkVentaNotaCredito.getVentaCreditoFormulario().setFecCreacion(new Date());
            bkVentaNotaCredito.getVentaCreditoFormulario().setNumnc(UtilitarioCadenas.formatoNumeroDocumento(Integer.parseInt(bkVentaNotaCredito.getVentaCreditoFormulario().getNumnc())));
            
            ResultadoServicio rs = servicioVentaNotaCredito.guardarVentaNotaCredito(bkVentaNotaCredito.getVentaCreditoFormulario());
            Integer ID = (Integer) rs.getID();

            CorrelativoDocumento correlativo = new CorrelativoDocumento();
            TipoDocumento tipoDocumento = new TipoDocumento();
            tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_NOTA_CREDITO);

            Integer numero = Integer.parseInt(bkVentaNotaCredito.getVentaCreditoFormulario().getNumnc()) + 1;

            correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
            correlativo.setIdsede(session.getSede());
            correlativo.setSerie(bkVentaNotaCredito.getVentaCreditoFormulario().getSerienc());
            CorrelativoDocumento correlativoEncontrado = servicioCorrelativo.obtenerCorrelativoTipoDocSede1(correlativo);

            if (numero > Integer.parseInt(correlativoEncontrado.getNumero())) {
                correlativoEncontrado.setNumero(UtilitarioCadenas.formatoNumeroDocumento(numero));
                servicioCorrelativo.actualizarCorrelativoDocumento(correlativoEncontrado);
            }

            for (VentaDetalleNotaCredito detalle : bkVentaDetalleNotaCredito.getListaDetalleNotaCredito()) {
                detalle.setCodnc(servicioVentaNotaCredito.obtenerNotaCreditobyID(ID));
                servicioVentaDetalleNotaCredito.guardarVentaDetalleNotaCredito(detalle);

            }


            bkVentaNotaCredito.setVentaCreditoSeleccionado(bkVentaNotaCredito.getVentaCreditoFormulario());
            buscarListaNotasCredito();

            mostrarMensaje("Se guardó la Nota de Crédito satisfactoriamente.");
            return editar();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_CREDITO;
        }
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String editar() {
        bkVentaNotaCredito.setVentaCreditoFormulario(bkVentaNotaCredito.getVentaCreditoSeleccionado());
        mbComponenteFindCliente.clearObserver();
        mbComponenteFindCliente.addObserver(this);

        mbComponenteAddFacturaNC.clearObserver();
        mbComponenteAddFacturaNC.addObserver(this);
        //mbComponenteAddFacturaNC.cargaInicial();
        bkVentaNotaCredito.setComando(new ComandoActualizar(this));
        try {
            bkVentaNotaCredito.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            bkVentaNotaCredito.setListaMotivoEmision(new ArrayList<ParametroDetalle>(servicioParametro.listaTipoMotivoNotaCredito()));
            bkVentaDetalleNotaCredito.setListaDetalleNotaCredito(new ArrayList<VentaDetalleNotaCredito>());
            bkVentaNotaCredito.setVentaCreditoFormulario(bkVentaNotaCredito.getVentaCreditoSeleccionado());
            //bkVentaNotaCredito.setIdTipoMoneda(servicioVentaNotaCredito.obtenerIdMonedaNotaCredito(bkVentaNotaCredito.getVentaCreditoFormulario().getCodnc()));
            bkVentaNotaCredito.setIdTipoMotivo(servicioVentaNotaCredito.obtenerIdMotivoNotaCredito(bkVentaNotaCredito.getVentaCreditoFormulario().getCodnc()));
            bkVentaNotaCredito.setNumero(bkVentaNotaCredito.getVentaCreditoFormulario().getSerienc().concat(bkVentaNotaCredito.getVentaCreditoFormulario().getNumnc()));
            bkVentaDetalleNotaCredito.setListaDetalleNotaCredito(new ArrayList<VentaDetalleNotaCredito>());
            bkVentaDetalleNotaCredito.setListaDetalleNotaCredito(servicioVentaDetalleNotaCredito.obtenerVentaDetalleNotaCredito(bkVentaNotaCredito.getVentaCreditoFormulario().getCodnc()));
            actualizarEstado();
            //return URLPaginacion.Ventas.URL_FORMULARIO_EDITAR_NOTA_CREDITO;
            return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_CREDITO;
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_NOTA_CREDITO;
        }

    }

    @Override
    public String nuevo() {
        mbComponenteFindCliente.clearObserver();
        mbComponenteFindCliente.addObserver(this);

        mbComponenteAddFacturaNC.clearObserver();
        mbComponenteAddFacturaNC.addObserver(this);
        //mbComponenteAddFacturaNC.cargaInicial();

        bkVentaNotaCredito.setComando(new ComandoGuardar(this));
        try {
            //cargar correlativo



            VentaNotaCredito notacredito = new VentaNotaCredito();
            notacredito.setFechanc(new Date());
            notacredito.setEstado(COLOR_ESTADO_VENTA.CREADA.getEstado());
            notacredito.setSede(session.getSede());
            notacredito.setFechaMod(new Date());
            notacredito.setFechaRecep(new Date());

            List<TipoCambio> lista = (List<TipoCambio>) servicioTipoCambio.listarTipoCambiosPorFiltro(new Date(), new Date());

            if (lista.isEmpty()) {
                mostrarError("Ingresar el Tipo de Cambio del día de hoy");
                return URLPaginacion.Ventas.URL_LISTA_NOTA_CREDITO;
            } else {
                notacredito.setTipocambio(lista.get(0).getVenta().doubleValue());

            }

            TipoDocumento tipoDocumento = new TipoDocumento();
            tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_NOTA_CREDITO);
            CorrelativoDocumento correlativo = new CorrelativoDocumento();
            correlativo.setIdsede(session.getSede());
            correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
            bkVentaNotaCredito.setListaCorrelativos(servicioCorrelativo.listarCorrelativoPorDocumentoYSede(correlativo));


            bkVentaNotaCredito.setVentaCreditoFormulario(notacredito);
            bkVentaNotaCredito.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            bkVentaNotaCredito.setListaMotivoEmision(new ArrayList<ParametroDetalle>(servicioParametro.listaTipoMotivoNotaCredito()));
            bkVentaDetalleNotaCredito.setListaDetalleNotaCredito(new ArrayList<VentaDetalleNotaCredito>());


        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_NOTA_CREDITO;
        }

        return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_CREDITO;
    }

    @Override
    public String ver() {
        try {
            bkVentaNotaCredito.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            bkVentaNotaCredito.setListaMotivoEmision(new ArrayList<ParametroDetalle>(servicioParametro.listaTipoMotivoNotaCredito()));
            bkVentaDetalleNotaCredito.setListaDetalleNotaCredito(new ArrayList<VentaDetalleNotaCredito>());
            bkVentaNotaCredito.setVentaCreditoFormulario(bkVentaNotaCredito.getVentaCreditoSeleccionado());
            bkVentaNotaCredito.setIdTipoMoneda(servicioVentaNotaCredito.obtenerIdMonedaNotaCredito(bkVentaNotaCredito.getVentaCreditoFormulario().getCodnc()));
            bkVentaNotaCredito.setIdTipoMotivo(servicioVentaNotaCredito.obtenerIdMotivoNotaCredito(bkVentaNotaCredito.getVentaCreditoFormulario().getCodnc()));
            bkVentaNotaCredito.setNumero(bkVentaNotaCredito.getVentaCreditoFormulario().getSerienc() + "-" + bkVentaNotaCredito.getVentaCreditoFormulario().getNumnc());
            bkVentaDetalleNotaCredito.setListaDetalleNotaCredito(new ArrayList<VentaDetalleNotaCredito>());
            bkVentaDetalleNotaCredito.setListaDetalleNotaCredito(servicioVentaDetalleNotaCredito.obtenerVentaDetalleNotaCredito(bkVentaNotaCredito.getVentaCreditoFormulario().getCodnc()));
            actualizarEstado();
            System.out.println("enlace: "+URLPaginacion.Ventas.URL_FORMULARIO_VER_NOTA_CREDITO);
            
            return URLPaginacion.Ventas.URL_FORMULARIO_VER_NOTA_CREDITO;
            
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_NOTA_CREDITO;
        }
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void actualizarObservador(Object object) {
        if (object instanceof Cliente) {
            Cliente cliente = (Cliente) object;
            bkVentaNotaCredito.getVentaCreditoFormulario().setIdcliente(cliente);
            bkVentaNotaCredito.getVentaCreditoFormulario().setRuc(cliente.getNumeroDocumento());
            bkVentaNotaCredito.getVentaCreditoFormulario().setEmpresa(cliente.getRazonSocial());
            bkVentaNotaCredito.getVentaCreditoFormulario().setDireccion(cliente.getDireccionLegal());
        }
        if (object instanceof VentaDetalleFacturacion) {
            try {
                VentaDetalleFacturacion comp = (VentaDetalleFacturacion) object;
                VentaFacturacion factura = servicioVentaFacturacion.obtenerFacturacion(comp.getVentaDetalleFacturacionPK().getCoddocventa());

                VentaDetalleNotaCredito detalle = new VentaDetalleNotaCredito();
                detalle.setDescripcion(comp.getDescProducto());
                detalle.setFecha(comp.getFecCreacion());
                detalle.setCantidad(comp.getCantidad());
                detalle.setPrecioUni(comp.getPrecUnitario());
                detalle.setImporte(comp.getCantidad() * comp.getPrecUnitario());
                detalle.setNumero(factura.getNumFactura());
                detalle.setSerie(factura.getSerieFactura());

                bkVentaDetalleNotaCredito.getListaDetalleNotaCredito().add(detalle);

                try {
                    double total = 0.0;
                    double subtotal = 0.0;
                    double igv = 0.0;
                    for (VentaDetalleNotaCredito detallev : bkVentaDetalleNotaCredito.getListaDetalleNotaCredito()) {
                        subtotal = subtotal + detallev.getImporte();
                    }

                    igv = servicioIgv.ConseguirIgvVigente().getMonto().doubleValue() * subtotal / 100;
                    total = subtotal + igv;

                    bkVentaNotaCredito.getVentaCreditoFormulario().setImporte(subtotal);
                    bkVentaNotaCredito.getVentaCreditoFormulario().setIgv(igv);
                    bkVentaNotaCredito.getVentaCreditoFormulario().setTotal(total);

                    convertirALetra();
                } catch (ServiceException e) {
                    mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
                    logger.error(e.getMessage(), e);
                }

            } catch (ServiceException ex) {
                java.util.logging.Logger.getLogger(MBVentaNotaCredito.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }

    public void buscarListaNotasCredito() {
        try {
            bkVentaNotaCredito.setListaNotasCredito(servicioVentaNotaCredito.obtenerVentaNotaCreditoBusqueda(
                    bkVentaNotaCredito.getVentaCreditoBusqueda(), bkVentaNotaCredito.getBusquedaDel(), bkVentaNotaCredito.getBusquedaAl()));

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String mostrar() {


        VentaNotaCredito notacredito = new VentaNotaCredito();
        notacredito.setNumnc("");
        notacredito.setRuc("");
        notacredito.setSede(session.getSede());
        bkVentaNotaCredito.setVentaCreditoBusqueda(notacredito);
        bkVentaNotaCredito.setBusquedaDel(null);
        bkVentaNotaCredito.setBusquedaAl(null);

        return URLPaginacion.Ventas.URL_LISTA_NOTA_CREDITO;
    }

    public void anular() {
        bkVentaNotaCredito.getVentaCreditoFormulario().setEstado(COLOR_ESTADO_VENTA.ANULADO.getEstado());
        servicioVentaNotaCredito.actualizarVentaNotaCredito(bkVentaNotaCredito.getVentaCreditoFormulario());
        actualizarEstado();
    }

    public void exportar() {
    }

    public void buscarNumDoc() {
        for (CorrelativoDocumento correlativo : bkVentaNotaCredito.getListaCorrelativos()) {
            if (correlativo.getSerie().equalsIgnoreCase(bkVentaNotaCredito.getVentaCreditoFormulario().getSerienc())) {
                bkVentaNotaCredito.getVentaCreditoFormulario().setNumnc(correlativo.getNumero());
            }
        }
    }

    public String imprimir() {

        System.out.println("entro a imprimir 1 ");
        if (!VentaFacturacionPrintHelper.verificarImpresora(session.getSede().getRecursoImpresora())) {
            mostrarError("No se pudo conectar con la impresora");
            return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_CREDITO;
        }
        System.out.println("entro a imprimir 2 ");
        try {
            bkVentaNotaCredito.getVentaCreditoFormulario().setEstado(COLOR_ESTADO_VENTA.EMITIDO.getEstado());
            
            if (bkVentaNotaCredito.getComando().getNombre().equalsIgnoreCase("Actualizar")) {
                actualizar();
            } else {
                guardar();
            }
            System.out.println("entro a imprimir 3 ");
            if (bkVentaNotaCredito.getVentaCreditoFormulario().getCodnc()== null) {
                mostrarError("Error al guardar el formulario. Verifique que los datos sean correctos.");
                return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_CREDITO;
            }
            System.out.println("entro a imprimir 4 ");
            VentaFacturacionPrintHelper.imprimirNotaCredito(bkVentaNotaCredito.getVentaCreditoFormulario(), bkVentaDetalleNotaCredito.getListaDetalleNotaCredito(), session.getSede().getRecursoImpresora());
            System.out.println("entro a imprimir 5 ");
            //actualizarEstado();
            mostrarMensaje("Se lanzó la impresión satisfactoriamente.");
            return ver();
        } catch (PrinterException e) {
            System.out.println("entro a imprimir 7 ");
            mostrarError("No se pudo realizar la impresión");
            e.printStackTrace();
            return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_CREDITO;
        }
    }

    public void eliminarDetalle() {

        if (bkVentaDetalleNotaCredito.getDetalleNotaCreditoSeleccionado().getCodncitem() == null) {
            Iterator itr = bkVentaDetalleNotaCredito.getListaDetalleNotaCredito().iterator();
            while (itr.hasNext()) {
                VentaDetalleNotaCredito det = (VentaDetalleNotaCredito) itr.next();

                if (bkVentaDetalleNotaCredito.getDetalleNotaCreditoSeleccionado().getNumero().equalsIgnoreCase(det.getNumero())
                        && bkVentaDetalleNotaCredito.getDetalleNotaCreditoSeleccionado().getSerie().equalsIgnoreCase(det.getSerie())) {
                    itr.remove();
                    break;
                }
            }

        } else {
            bkVentaDetalleNotaCredito.getListaDetalleNotaCredito().remove(bkVentaDetalleNotaCredito.getDetalleNotaCreditoSeleccionado());
        }


        try {
            double total = 0.0;
            double subtotal = 0.0;
            double igv = 0.0;
            for (VentaDetalleNotaCredito detallev : bkVentaDetalleNotaCredito.getListaDetalleNotaCredito()) {
                subtotal = subtotal + detallev.getImporte();
            }

            igv = servicioIgv.ConseguirIgvVigente().getMonto().doubleValue() * subtotal / 100;
            total = subtotal + igv;

            bkVentaNotaCredito.getVentaCreditoFormulario().setImporte(subtotal);
            bkVentaNotaCredito.getVentaCreditoFormulario().setIgv(igv);
            bkVentaNotaCredito.getVentaCreditoFormulario().setTotal(total);
            convertirALetra();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void actualizarEstado() {


        if (bkVentaNotaCredito.getVentaCreditoFormulario().getEstado() == COLOR_ESTADO_VENTA.ANULADO.getEstado()) {
            bkVentaNotaCredito.setEstado(COLOR_ESTADO_VENTA.ANULADO.getValor());
            bkVentaNotaCredito.setColor(COLOR_ESTADO_VENTA.ANULADO.getColor());
            bkVentaNotaCredito.setEditable(true);
            bkVentaNotaCredito.setAnulable(true);
        }
        if (bkVentaNotaCredito.getVentaCreditoFormulario().getEstado() == COLOR_ESTADO_VENTA.CREADA.getEstado()) {
            bkVentaNotaCredito.setEstado(COLOR_ESTADO_VENTA.CREADA.getValor());
            bkVentaNotaCredito.setColor(COLOR_ESTADO_VENTA.CREADA.getColor());
            bkVentaNotaCredito.setEditable(false);
            bkVentaNotaCredito.setAnulable(false);
        }
        if (bkVentaNotaCredito.getVentaCreditoFormulario().getEstado() == COLOR_ESTADO_VENTA.EMITIDO.getEstado()) {
            bkVentaNotaCredito.setEstado(COLOR_ESTADO_VENTA.EMITIDO.getValor());
            bkVentaNotaCredito.setColor(COLOR_ESTADO_VENTA.EMITIDO.getColor());
            bkVentaNotaCredito.setEditable(true);
            bkVentaNotaCredito.setAnulable(false);
        }
        if (bkVentaNotaCredito.getVentaCreditoFormulario().getEstado() == COLOR_ESTADO_VENTA.PAGADA.getEstado()) {
            bkVentaNotaCredito.setEstado(COLOR_ESTADO_VENTA.PAGADA.getValor());
            bkVentaNotaCredito.setColor(COLOR_ESTADO_VENTA.PAGADA.getColor());
            bkVentaNotaCredito.setEditable(true);
            bkVentaNotaCredito.setAnulable(true);
        }

        if (bkVentaNotaCredito.getVentaCreditoFormulario().getEstado() == COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getEstado()) {
            bkVentaNotaCredito.setEstado(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getValor());
            bkVentaNotaCredito.setColor(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getColor());
            bkVentaNotaCredito.setEditable(true);
            bkVentaNotaCredito.setAnulable(false);
        }
    }

    public void marcarInicio(DateSelectEvent event) {
        bkVentaNotaCredito.setBusquedaDel(event.getDate());
    }

    public void marcarFinal(DateSelectEvent event) {
        bkVentaNotaCredito.setBusquedaAl(event.getDate());
    }

    public void convertirALetra() {
        if (bkVentaNotaCredito.getVentaCreditoFormulario().getTotal() != null) {
            UtilitarioNumeroALetras valorLetras = new UtilitarioNumeroALetras();
            bkVentaNotaCredito.getVentaCreditoFormulario().setTotalletras(valorLetras.Convertir(String.valueOf(bkVentaNotaCredito.getVentaCreditoFormulario().getTotal()), true,
                    bkVentaNotaCredito.getVentaCreditoFormulario().getMoneda().getNombre()));
        }

    }
    
    public boolean estaHabilitado(char estado) {
        if (estado == COLOR_ESTADO_VENTA.EMITIDO.getEstado() || estado == COLOR_ESTADO_VENTA.ANULADO.getEstado()) {
            return true;
        } else {
            return false;
        }
    }
    
}
